static inline void
render_fallback_node (GskGLRenderer *self,
GskRenderNode *node,
- RenderOpBuilder *builder,
- const GskQuadVertex *vertex_data)
+ RenderOpBuilder *builder)
{
+ const float min_x = builder->dx + node->bounds.origin.x;
+ const float min_y = builder->dy + node->bounds.origin.y;
+ const float max_x = min_x + node->bounds.size.width;
+ const float max_y = min_y + node->bounds.size.height;
const float scale = ops_get_scale (builder);
const int surface_width = ceilf (node->bounds.size.width) * scale;
const int surface_height = ceilf (node->bounds.size.height) * scale;
cairo_t *cr;
int cached_id;
int texture_id;
+ const GskQuadVertex offscreen_vertex_data[GL_N_VERTICES] = {
+ { { min_x, min_y }, { 0, 1 }, },
+ { { min_x, max_y }, { 0, 0 }, },
+ { { max_x, min_y }, { 1, 1 }, },
+
+ { { max_x, max_y }, { 1, 0 }, },
+ { { min_x, max_y }, { 0, 0 }, },
+ { { max_x, min_y }, { 1, 1 }, },
+ };
+
if (surface_width <= 0 ||
surface_height <= 0)
{
ops_set_program (builder, &self->blit_program);
ops_set_texture (builder, cached_id);
- ops_draw (builder, vertex_data);
+ ops_draw (builder, offscreen_vertex_data);
return;
}
cairo_surface_set_device_scale (surface, scale, scale);
cr = cairo_create (surface);
+ /* We draw upside down here, so it matches what GL does. */
cairo_save (cr);
- cairo_translate (cr, -node->bounds.origin.x, -node->bounds.origin.y);
+ cairo_scale (cr, 1, -1);
+ cairo_translate (cr, -node->bounds.origin.x, ceilf (-node->bounds.origin.y - node->bounds.size.height));
gsk_render_node_draw (node, cr);
cairo_restore (cr);
ops_set_program (builder, &self->blit_program);
ops_set_texture (builder, texture_id);
- ops_draw (builder, vertex_data);
+ ops_draw (builder, offscreen_vertex_data);
}
static inline void
/* TODO: Implement blurred inset shadows as well */
if (gsk_inset_shadow_node_get_blur_radius (node) > 0)
{
- render_fallback_node (self, node, builder, vertex_data);
+ render_fallback_node (self, node, builder);
return;
}
if (shadow->radius > 0)
{
- render_fallback_node (self, node, builder, vertex_data);
+ render_fallback_node (self, node, builder);
return;
}
}
case GSK_CAIRO_NODE:
default:
{
- render_fallback_node (self, node, builder, vertex_data);
+ render_fallback_node (self, node, builder);
}
}
}